//: Playground - noun: a place where people can play

import UIKit

class Person : NSObject {
    var age: Int = 0;
    
    // swift 的属性
    // 存储属性，类实例的一部分，存储常量和变量
    // 可以给存储属性提供一个默认值，或者在初始化方法中赋值
    var name: String?;//定义为可选类型
    var mathScore: Double = 0.0;
    var englishScore: Double = 0.0;
    
    // 构造函数
    override init() {
        print("---init");
    }
    
    init(name: String, age: Int) {
        self.name = name;
        self.age = age;
    }
    
    init(dict: Dictionary<String, AnyObject>) {
        
//        // as? 最终转换的未可选类型
//        let tmpname = dict["name"];
//        self.name = tmpname as? String;
//        
//        // as!最终转换的未确定类型，有可能发生问题！！！
//        let tmpAge = dict["age"]
//        self.age = tmpAge as! Int

        
        // 安全的方式给属性赋值
        if let tmpName = dict["name"] as? String {
            self.name = tmpName;
        }

        if let tmpAge = dict["age"] as? Int {
            self.age = tmpAge;
        }
    }
    
    init(dict1: [String : Any]) {
        super.init();
        
        setValuesForKeys(dict1);
    }
    
    
    func getAverageScore() -> Double {
        return (mathScore + englishScore) * 0.5;
    }
    
    // 计算属性，通过别的方式计算得到的结果属性
    var averageScore: Double {
        return (mathScore + englishScore) * 0.5;
    }
    
    // 类属性，static
    static var couseCount: Int = 0;
    
    // 重写父类的方法需要使用关键字override
    // 重写KVC方法
    override func setValue(_ value: Any?, forKey key: String) {
        
    }
    
    override func value(forKey key: String) -> Any? {
        return nil;
    }
}


let p = Person();
// 使用属性赋值
p.age = 20;

// 使用KVC赋值
p.setValue(40, forKey: "age");
p.age;

// KVC给不存在的属性赋值，默认情况下回崩溃
p.setValue(140, forKey: "height");
p.value(forKey: "height");

p.name = "AAA"
print(p.name);///Warning

// 使用可选绑定，进行安全操作
if let name = p.name {
    print(name)
}

p.name = "XX";
if let name = p.name {
    print(name)
}

p.mathScore = 88.0;
p.englishScore = 99.0;
p.getAverageScore();
p.averageScore;//计算属性取值

// 使用自定义的构造函数初始化对象
let p1 = Person(name: "xiaomin", age: 20);
p1.age;
p1.name;







